#ifndef CAMERAPLUGININTERFACE_H
#define CAMERAPLUGININTERFACE_H

#include <QObject>
#include <QtPlugin>
#include <QPair>
#include <QDialog>
#include <QMenu>

// 定义所有插件名称宏，方便统一管理和修改
// 统一使用无空格的驼峰命名法格式
#define GRAPHICS_DISPLAY_PLUGIN_NAME "GraphicsDisplayPlugin"
#define IMAGE_MANAGEMENT_PLUGIN_NAME "ImageManagementPlugin"
#define DEVICE_MANAGEMENT_PLUGIN_NAME "DeviceManagementPlugin"
#define DEVELOPER_MODE_PLUGIN_NAME "DeveloperModePlugin"
#define CONTROL_COMMAND_GENERATOR_PLUGIN_NAME "ControlCommandGeneratorPlugin"
#define LOG_PLUGIN_NAME "LogPlugin"
#define IMAGE_PROCESSING_ALGORITHM_MANAGER_PLUGIN_NAME "ImageProcessingAlgorithmManager"
#define MEASUREMENT_MANAGEMENT_PLUGIN_NAME "MeasurementManagement"

// 定义所有消息指令宏，统一指令格式
#define CMD_REGISTER_IMAGE_DISPLAY "REGISTER_IMAGE_DISPLAY"
#define CMD_UPDATE_IMAGE_DISPLAY "UPDATE_IMAGE_DISPLAY"
#define CMD_UNREGISTER_IMAGE_DISPLAY "UNREGISTER_IMAGE_DISPLAY"
#define CMD_SET_SCALE "SET_SCALE"
#define CMD_IMAGE_SELECTED "IMAGE_SELECTED"
#define CMD_IMAGE_DESELECTED "IMAGE_DESELECTED"
#define CMD_IMAGE_READY_FOR_PROCESSING "IMAGE_READY_FOR_PROCESSING"
#define CMD_PROCESS_IMAGE "PROCESS_IMAGE"
#define CMD_IMAGE_UPDATE "IMAGE_UPDATE"
#define CMD_IMAGE_COMPLETE "IMAGE_COMPLETE"
#define CMD_UPDATE_PROCESSED_IMAGE "UPDATE_PROCESSED_IMAGE"
#define CMD_FRAMEWORK_INITIALIZED "FRAMEWORK_INITIALIZED"
#define CMD_OPERATION_UNDO_SUCCESS "OPERATION_UNDO_SUCCESS"
#define CMD_OPERATION_REDO_SUCCESS "OPERATION_REDO_SUCCESS"
#define CMD_LOG "LOG"
#define CMD_CAMERA_CONNECTED "CAMERA_CONNECTED"
#define CMD_CAMERA_DISCONNECTED "CAMERA_DISCONNECTED"
#define CMD_MEASUREMENT_REQUEST "MEASUREMENT_REQUEST"
#define CMD_MEASUREMENT_READY "MEASUREMENT_READY"
#define CMD_SCALE_CHANGED "DISPLAY_WIDGET_SCALE_CHANGED"
#define CMD_UNIT_CONVERSION_CHANGED  "DISPLAY_WIDGET_UNIT_CONVERSION_CHANGED"
/**
 * @brief 枚举类型，表示主窗口中的各种QDockWidget
 * @details 每个枚举值对应UI中的一个停靠窗口，用于通过类型安全的方式访问不同的dock部件
 */
enum class DockWidgetType {
    DeviceControl,        //设备控制停靠窗口
    ImageProcessing,      //图像处理停靠窗口
    MeasurementTools,     //测量工具停靠窗口
    MeasurementResults,   //测量结果停靠窗口
    SoftwareLog,          //软件运行提示停靠窗口
    ImagePreview,         //图像预览停靠窗口
    ImageDisplay          //图像显示停靠窗口(不允许注册)
};

class CameraPluginInterface : public QObject {
    Q_OBJECT
public:
    explicit CameraPluginInterface(QObject* parent=nullptr):QObject(parent){}
    virtual ~CameraPluginInterface(){};

    // 插件初始化接口，用于执行插件启动所需的初始化操作（如连接相机、加载配置等）
    virtual void initialize() = 0;

    // 获取插件名称（唯一标识，用于主框架识别插件）
    virtual QString pluginName() const = 0;

    // 获取插件描述信息（用于主框架界面展示插件功能说明）
    virtual QString description() const = 0;

public slots:
    // 通用消息接收槽（支持跨插件调用）
    virtual void onPluginMessage(const QString& sender, const QString& message) = 0;
    

 signals:
    // 通用消息发送信号（支持向特定插件发送消息）
    // 如果targetPluginName为空，则表示发送给所有插件
    void pluginMessageSent(const QString& sender, const QString& message, const QString& targetPluginName = "");
    
    /**
     * @brief 请求调用其他插件的函数
     * @param targetPluginName 目标插件名称
     * @param functionName 要调用的函数名称
     * @param args 参数列表
     * @param returnValue 函数调用的返回值引用
     * @return 调用是否成功
     */
    bool requestPluginFunctionCall(const QString& targetPluginName, const QString& functionName, const QVariantList& args, QVariant& returnValue);

    /**
     * @brief 注册菜单项到主窗口
     * @param menuIndex 菜单索引，表示菜单项的位置
     * @param menuObject 菜单对象指针
     */
    void registerMenuItem(int menuIndex, QObject *menuObject);

    /**
     * @brief 注册菜单项到主窗口
     * @param indexs 菜单索引路径向量，每一层的索引值
     * @param title 菜单项显示的文本
     * @param pActionWidget 点击菜单项时显示的对话框
     */
    void registerMenuItem(const QVector<int> &indexs, const QString &title, QDialog *pActionWidget);

    /**
     * @brief 注册菜单项到主窗口菜单
     * @param menuIndex 菜单索引，表示菜单项的位置
     * @param title 菜单名字
     * @return 菜单对象
     */
    QMenu* registerMenuItem(int menuIndex, const QString &title);

    /**
     * @brief 注册widget到图形显示区域
     * @param dockWidgetType 要注册到的dock部件类型（对应MainWindow::DockWidgetType枚举值）
     * @param pWidget 要注册的widget指针
     */
    void registerWidgetToDock(DockWidgetType dockWidgetType, QWidget *pWidget);

    /**
     * @brief 注册widget到图形显示区域
     * @param graphicsGuid 图形的Guid
     * @param titleString 标题名称
     * @param pWidget 要注册的widget指针
     */
    void registerGraphicsDisplayWidget(const QString& graphicsGuid,const QString& titleString, QWidget *pWidget);
    
    /**
     * @brief 注销图形显示窗口
     * @param graphicsGuid 要注销的图形GUID
     */
    void unregisterGraphicsDisplayWidget(const QString& graphicsGuid);
    
    /**
     * @brief 切换到指定的图形显示窗口
     * @param graphicsGuid 要切换到的图形GUID
     */
    void switchToGraphicsDisplayWidget(const QString& graphicsGuid);

    /**
     * @brief 关闭图形显示窗口
     * @param graphicsGuid 要注销的图形GUID
     */
    void closeGraphicsDisplayWidget(const QString& graphicsGuid);
    
};

Q_DECLARE_INTERFACE(CameraPluginInterface, "Camera.CameraPluginInterface/1.0")

#endif // CAMERAPLUGININTERFACE_H
